/*	Nama file		: Calendar.h
	Deskripsi		: Deklarasi type dan prototype primitif type Calender dengan menggunakan Priority List linier berkait
	Nama pembuat	: Jonathan Ery Pradana (23512038), Muhammad Ghufron Mahfudhi (23512066), Ni Made Satvika (23512077), Karina Novita Suryani (23512187)
	Hari / Tanggal	: Kamis, 27 September 2012
*/

#ifndef Calendar_H
#define Calendar_H

#include <stdio.h>
#include <stdlib.h>
#include "../Event/Event.h"

/* Deklarasi infotype */
typedef Event infoType;
/* List dengan representasi berkait dengan pointer */
typedef struct tElmtCal *addressCal;
typedef struct tElmtCal {
		infoType Info;
		addressCal Next;
} ElmtCal;
/* Type List dengan ciri First: */
typedef struct {
		addressCal First;
} ListCal;

/* Selektor */
#define First(L) (L).First
#define InfoFirst(L) (L).First->Info
#define Next(P) (P)->Next
#define Info(P) (P)->Info
#define MAX_STRING 100

/* Prototype manajemen memori */
void alokasiCal (addressCal *P, infoType X);
/* I.S. Sembarang */
/* F.S. Alamat P dialokasi, jika berhasil maka Info(P)=X dan Next(P)=NULL */
/* P=NULL jika alokasi gagal */
void dealokasiCal (addressCal P);
/* I.S. P adalah hasil alokasi, P <> NULL */
/* F.S. Alamat P didealokasi, dikembalikan ke sistem */

/*** Predikat Pemeriksaan Kondisi ListCal ***/
int IsEmpty (ListCal C);
/* Mengirim 1 jika C kosong: First(C)=NULL */
int NBElmt(ListCal C);
/* Mengirimkan banyaknya elemen ListCal. Mengirimkan 0 jika C kosong */

/*** Kreator ***/
void CreateEmpty(ListCal * C);
/* I.S. sembarang */
/* F.S. Sebuah C kosong terbentuk */

/*** Destruktor ***/
void DelCal(ListCal * C);
/* I.S. C berisi */
/* F.S. C terhapus, setiap address nya didealokasi */

/*** Primitif Add/Delete ***/
void Add (ListCal * C, infoType X);
/* Proses: Mengalokasi X dan menambahkan X dalam C sesuai priority berdasarkan DateTime-nya jika alokasi berhasil; jika alokasi gagal C tetap */
/* I.S. C mungkin kosong */
/* F.S. X ditambahkan ke dalam C sesuai priority-nya */

void DelFirst (ListCal * C);
/* Proses: Menghapus X pada bagian First dari C dan mendealokasi elemen First */
/* Pada dasarnya operasi delete first */
/* I.S. C tidak mungkin kosong */
/* F.S. X = nilai elemen First pd I.S., First "mundur" */
void DelParam (ListCal * C, int ENum);
/* Proses: Menghapus X pada bagian Event dengan nomor ENum dari C dan mendealokasi elemen tersebut */
/* I.S. C tidak mungkin kosong */
/* F.S. X = nilai Event dengan nomor ENum, isi ListCal bergeser */

/*** Primitif Tambahan ***/
addressCal SearchEvent(ListCal C, int ENum);
/* Mengirimkan address Event dengan nomor ENum di dalam Calender C */
void Update(ListCal *C, int ENum);
/* Proses: Mengubah isi Event dengan nomor ENum */
/* I.S. C tidak mungkin kosong */
/* F.S. Event di dalam C dengan nomor ENum berganti atribut */

void AddEvent(ListCal *C);
/* Proses: Membaca Event baru dan menambahkannya ke dalam kalender*/
/* I.S. C mungkin kosong */
/* F.S. Event baru ditambahkan ke dalam C */

/*** Primitif View ***/
void ViewEvent(ListCal C, int ENum);
/* Proses : Menampilkan event dengan nomor Enum di dalam C */
/* I.S. C  tidak mungkin kosong*/
/* F.S. Event dengan nomor Enum tampil di layar*/
void ViewNFirst(ListCal C, int N);
/* Proses: Menampilkan N event pertama di dalam C */
/* I.S. C tidak mungkin kosong */
/* F.S. Event sebanyak N pertama tampil di layar */
void ViewNLast(ListCal C, int N);
/* Proses: Menampilkan N event terakhir di dalam C */
/* I.S. C tidak mungkin kosong */
/* F.S. Event sebanyak N terakhir tampil di layar */
void ViewListCal(ListCal C);
/* Proses: Menampilkan semua event di dalam C dalam bentuk list of event */
/* I.S. C mungkin kosong */
/* F.S. Semua event tampil di layar dalam bentuk list of event */

/** Primitif Read dan Save File untuk Elemen Kalender **/
void ReadFileCal (char* fileName, ListCal *C);
/* Proses : Membaca file dari fileName, kemudian menyimpan isinya ke C */ 
/* I.S : C telah dibuat, fileName terfdefinisi 	*/
/* F.S : C terisi data yang berasal dari fileName */

void SaveFileCal (char* fileName, ListCal C);
/* Proses : Menuliskan elemen - elemen C ke dalam File fileName */
/* I.S	: fileName terdefinisi, C berisi event yang akan dituliskan ke file */
/* F.S	: File yang bernama fileName terbentuk, dan berisi elemen C */

#endif
